<!DOCTYPE HTML>
<html>
<head>

    <title>8½, el Sistema gráfico de Ventanas de Plan 9</title>

    <link rel="stylesheet" href="/pub/style/style.css" type="text/css" media="screen, handheld" title="default">
    <link rel="shortcut icon" href="/favicon.ico" type="image/vnd.microsoft.icon">

    <meta charset="UTF-8">
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 


<meta name="verify-v1" content="6zEoK0WMlnLmIS/w7Pnh6+srZECHsvnMGN0kQmowSGk=" />
<meta name="google-site-verification" content="z5zCyEitNLNZmhVblsogrEiy6Acf0UZROsFMtLjioN4" />
<META name="y_key" content="49dff3fad5352458"><META name="y_key" content="5dc40bfee9494e98"><META name="y_key" content="b60a53d1fa98f4c8">
<meta name="msvalidate.01" content="5008C6E6B172BEB1F43E770296C3D560" />
<meta name="alexaVerifyID" content="l1vBNiKWqe9hCZhp0jV8OKPyjps" />

    

</head>
<body>

<div id="header">
    <div class="superHeader">
    <div class="left">
      <a href="http://quotes.cat-v.org">quotes</a> |
      <a href="http://doc.cat-v.org">docs</a> |
      <a href="http://repo.cat-v.org">repo</a> |
      <a href="http://go-lang.cat-v.org">golang</a> |
      <a href="http://sam.cat-v.org">sam</a> |
      <a href="http://man.cat-v.org">man</a> |
      <a href="http://acme.cat-v.org">acme</a> |
      <a href="http://glenda.cat-v.org">Glenda</a> |
      <a href="http://ninetimes.cat-v.org">9times</a> |
      <a href="http://harmful.cat-v.org">harmful</a> |
      <a href="http://9p.cat-v.org/">9P</a> |
      <a href="http://cat-v.org">cat-v.org</a>
    </div>

    <div class="right">

      <span class="doNotDisplay">Related sites:</span>
      | <a href="http://cat-v.org/update_log">site updates</a>
      | <a href="/sitemap">site map</a> |

    <script type="text/javascript">var addthis_disable_flash = true; var addthis_pub="uriell";</script>
    <a href="http://www.addthis.com/bookmark.php?v=20" onmouseover="return addthis_open(this, '', '[URL]', '[TITLE]')" onmouseout="addthis_close()" onclick="return addthis_sendto()"><img src="http://s7.addthis.com/static/btn/lg-share-en.gif" width="125" height="16" alt="Bookmark and Share" style="border:0"/></a><script type="text/javascript" src="http://s7.addthis.com/js/200/addthis_widget.js"></script>
    </div>

    </div>

    <div class="midHeader">
    <h1 class="headerTitle"><a href="/">/sys/doc/ <span id="headerSubTitle">Documentation archive</span></a></h1>
    </div>
    
    <div class="subHeader"><br></div>
</div>

    <div id="side-bar">
        <div>
<p class="sideBarTitle">Sections:</p>
<ul>
<li><a href="/bell_labs/">&rsaquo; bell labs/</a></li>
<li><a href="/economics/">&rsaquo; economics/</a></li>
<li><a href="/henry_spencer/">&rsaquo; henry spencer/</a></li>
<li><a href="/inferno/">&rsaquo; inferno/</a></li>
<li><a href="/plan_9/" class="thisPage">&raquo;<i> plan 9/</i></a></li>
<li><ul>
<li><a href="/plan_9/1st_edition/">&rsaquo; 1st edition/</a></li>
<li><a href="/plan_9/2nd_edition/">&rsaquo; 2nd edition/</a></li>
<li><a href="/plan_9/3rd_edition/">&rsaquo; 3rd edition/</a></li>
<li><a href="/plan_9/4th_edition/">&rsaquo; 4th edition/</a></li>
<li><a href="/plan_9/IWP9/">&rsaquo; IWP9/</a></li>
<li><a href="/plan_9/blue_gene/">&rsaquo; blue gene/</a></li>
<li><a href="/plan_9/humour/">&rsaquo; humour/</a></li>
<li><a href="/plan_9/misc/">&rsaquo; misc/</a></li>
<li><a href="/plan_9/programming/">&rsaquo; programming/</a></li>
<li><a href="/plan_9/real_time/">&rsaquo; real time/</a></li>
<li><a href="/plan_9/translations/" class="thisPage">&raquo;<i> translations/</i></a></li>
<li><ul>
<li><a href="/plan_9/translations/russian/">&rsaquo; russian/</a></li>
<li><a href="/plan_9/translations/spanish/" class="thisPage">&raquo;<i> spanish/</i></a></li>
<li><ul>
<li><a href="/plan_9/translations/spanish/8" class="thisPage">&raquo;<i> 8</i></a></li>
<li><a href="/plan_9/translations/spanish/9">&rsaquo; 9</a></li>
<li><a href="/plan_9/translations/spanish/names">&rsaquo; names</a></li>
<li><a href="/plan_9/translations/spanish/net">&rsaquo; net</a></li>
</ul></li>
</ul></li>
</ul></li>
<li><a href="/political_science/">&rsaquo; political science/</a></li>
<li><a href="/programming/">&rsaquo; programming/</a></li>
<li><a href="/unix/">&rsaquo; unix/</a></li>
<li><a href="/xml/">&rsaquo; xml/</a></li>
</ul>
        </div>
        <div>
<ul>
<li><a href="http://man.cat-v.org/plan_9/">- Plan 9 Man Pages</a></li>
<li><a href="http://ninetimes.cat-v.org">- NineTimes News</a></li>
</ul>
        </div>
    </div>

<div id="main-copy">



<p style="margin-top: 0; margin-bottom: 0.50in"></p>
<p style="margin-top: 0; margin-bottom: 0.21in"></p>

<p style="line-height: 1.4em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: center;">
<span style="font-size: 12pt"><b>8½, el Sistema gráfico de Ventanas de Plan 9</b></span></p>
<p style="margin-top: 0; margin-bottom: 0.21in"></p>

<p style="margin-top: 0; margin-bottom: 0.17in"></p>
<p style="line-height: 1.4em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: center;">
<span style="font-size: 10pt"><i>Rob Pike</i></span></p>
<p style="line-height: 1.4em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: center;">
<span style="font-size: 10pt"><i>rob@plan9.bell-labs.com</i></span></p>
<p style="margin-top: 0; margin-bottom: 0.17in"></p>

<p style="margin-top: 0; margin-bottom: 0.08in"></p>
<p style="margin-top: 0; margin-bottom: 0.33in"></p>
<p style="line-height: 1.4em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: center;">
<span style="font-size: 10pt"><i>ABSTRACT</i></span></p>
<p style="margin-top: 0; margin-bottom: 0.19in"></p>
<p style="margin-top: 0; margin-bottom: 0.17in"></p>

<p style="margin-top: 0; margin-bottom: 0.17in"></p>

<p style="margin-top: 0; margin-bottom: 0.17in"></p>

<p style="line-height: 1.2em; margin-left: 1.50in; text-indent: 0.00in; margin-right: 1.50in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">El sistema de Ventanas de Plan 9, 8½, es un programa de modesto tamaño y nuevo diseño.
Proporciona servicios de I/O en formato texto y gráficos en mapas de bits para programas cliente,
locales y remotos, con el objeto de ofrecer un servicio multiplexado de archivo para tales clientes.
Sirve los tradicionales archivos de UNIX como
</span><span style="font-size: 10pt"><tt>/dev/tty</tt></span><span style="font-size: 10pt">
así como aquellos más inusuales que proveen acceso al ratón
y a la pantalla tal cual.
Las operaciones de gráficos de mapas de bits son proporcionadas sirviendo un archivo llamado
</span><span style="font-size: 10pt"><tt>/dev/bitblt</tt></span><span style="font-size: 10pt">
que interpreta los mensajes del cliente para proporcionar una trama de operaciones.
El archivo de servicio que 8½ ofrece a sus clientes es idéntico al que usa para
su propia implementación, así que fundamentalmente no es más que
un multiplexador.
Esta arquitectura tiene algunas simetrías de compensación y pueden ser implementadas
de manera compacta.
</span></p><p style="margin-top: 0; margin-bottom: 0.17in"></p>

<p style="margin-top: 0; margin-bottom: 0.17in"></p>
<p style="margin-top: 0; margin-bottom: 0.17in"></p>
<p style="margin-top: 0; margin-bottom: 0.50in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt"><b>Introducción
</b></span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">En 1989 construí un sistema de ventanas de juguete en tan sólo algunos cientos de
líneas de código fuente usando un lenguaje familiar y una arquitectura inusual
que envolviese procesos concurrentes [Pike89].
Aunque ese sistema fue rudimentariamente mejorable, demostró que
los sistemas de ventanas no son complicados de una forma inherente.
Al año siguiente, para el nuevo sistema distribuido Plan 9 [Pike92], apliqué algunas de
de las lecciones de ese proyecto de juguete para escribir, en C,
un sistema de ventanas de calidad de producción
llamado 8½.
8½ proporciona, en blanco y negro, escala de grises, o pantallas a color,
los servicios requeridos de un sistema de ventana moderno, incluyendo
programabilidad y soporte para gráficos remotos.
El sistema entero, incluyendo el programa que por defecto corre en la
ventana &mdash; el equivalente de
</span><span style="font-size: 10pt"><tt>xterm</tt></span><span style="font-size: 10pt">
[Far89] con &lsquo;cortar y pegar&rsquo; entre ventanas &mdash;
está bien bajo 90 kilobytes de texto en un procesador Motorola 68020, siendo como
la mitad del tamaño
del kernel del sistema operativo
que lo soporta y la décima parte del tamaño del servidor X
[Sche86]
</span><span style="font-size: 10pt"><i>sin</i></span><span style="font-size: 10pt">
</span><span style="font-size: 10pt"><tt>xterm</tt></span><span style="font-size: 10pt">.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">Qué hace a 8½ tan compacto?  Mucho de lo salvado proviene sobre todo de simplificar:
8½ tiene una pequeña superposicionalidad gráfica, una interfaz de programación sencilla, y
una simple, fija interfaz de usuario.
8½ también toma algunas decisiones por autorización
&mdash; ratón de tres botones, solapación de ventanas, programa de terminal interno y
gestor de ventanas, etc. &mdash;
más que intentar satisfacer todos los gustos.
Aunque compacto, 8½ no es ascético.
Proporciona lo fundamental y
bastantes extras para hacerlo más cómodo de usar.
El ingrediente más importante para su mínimo tamaño, sin embargo, es sobretodo
su diseño como un servidor de archivos.
Esta estructura podría ser aplicable a los sistemas de ventana
en los tradicionales sistemas operativos de tipo UNIX.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">El pequeño tamaño de 8½ no refleja una funcionalidad restringida:
8½ provee un servicio ásperamente equivalente al X window system.
Los clientes de 8½ podrían, por supuesto, ser tan complejos como se desee,
aunque la tendencia a imitar el diseño de 8½
y la pulcra interfaz de programación viene a significar que
no están próximos a las hinchadas aplicaciones de X.
</span></p><p style="margin-top: 0; margin-bottom: 0.17in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt"><b>Modelo de Usuario
</b></span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">8½ conecta la &uacute;nica pantalla, ratón, y teclado del terminal
(en terminología de Plan 9) o workstation (en terminología comercial) dentro de un array
de terminales virtuales independientes que podrían ser terminales de texto con soporte de shell y
la usual suite de herramientas
o aplicaciones gráficas que requiriesen de todos los recursos de la pantalla de mapa de bits y el ratón.
El texto es representado en UTF, una codificación de la Unicode Standard [Pike93].
La interfaz de programación entera se proporciona a través de
la lectura y escritura de archivos en
</span><span style="font-size: 10pt"><tt>/dev</tt></span><span style="font-size: 10pt">.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">Primeramente por razones de historia y familiaridad,
el modelo general y la apariencia de 8½ son similares a los de
</span><span style="font-size: 10pt"><tt>mux</tt></span><span style="font-size: 10pt">
[Pike88].
El botón derecho tiene un pequeño men&uacute; para controlar la creación de ventanas, destrucción,
y emplazamiento.
Cuando se crea una ventana, arranca la shell por defecto,
</span><span style="font-size: 10pt"><tt>rc</tt></span><span style="font-size: 10pt">
[Duff90], con el estándard de entrada
y salida direccionado a la ventana y accesible a través del archivo
</span><span style="font-size: 10pt"><tt>/dev/cons</tt></span><span style="font-size: 10pt">
(&lsquo;console&rsquo;),
análogo al
</span><span style="font-size: 10pt"><tt>/dev/tty</tt></span><span style="font-size: 10pt">
de UNIX.
El cambio de nombres representa una ruptura con el pasado: Plan 9 no proporciona un
modelo de terminales de estilo teletipo.  8½ proporciona el &uacute;nico camino
para la mayoría de los usuarios que acceden a Plan 9.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">Las aplicaciones gráficas,
como los programas normales,
pueden correr tecleando sus nombres
en la shell que se ejecuta en una ventana.
Esto corre la aplicación en la misma ventana;
para correr la aplicación en una ventana nueva podría usarse un programa externo,
</span><span style="font-size: 10pt"><tt>window</tt></span><span style="font-size: 10pt">,
descrito más abajo.
Para las aplicaciones gráficas, el modelo de terminal virtual
es algo extendido para dejar a los programas manejar a su gusto las operaciones gráficas,
acceder al
ratón, e interactuar con funciones relacionadas con la lectura y escritura de archivos mediante
sugestivos nombres como
</span><span style="font-size: 10pt"><tt>/dev/mouse</tt></span><span style="font-size: 10pt">
y
</span><span style="font-size: 10pt"><tt>/dev/window</tt></span><span style="font-size: 10pt">
pre-ventana multiplexada
como
</span><span style="font-size: 10pt"><tt>/dev/cons</tt></span><span style="font-size: 10pt">.
La implementación y la semántica de estos archivos,
descrita más abajo, es central para la estructura de 8½.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">El programa por defecto que se ejecuta en una ventana es familiar para los usuarios de terminales Blit [Pike83].
Es muy similar al de
</span><span style="font-size: 10pt"><tt>mux</tt></span><span style="font-size: 10pt">
[Pike88], proporcionando edición basada en el ratón de entrada y salida de texto,
la viabilidad para el desplazamiento de pantalla [scroll] para ver salidas anteriores, y demás.
Tiene también una nueva característica, accionada pulsando ESC,
que otorga al usuario el control cuando
los caracteres tecleados pueden ser leidos por la shell o una aplicacion,
en vez de (por ejemplo) después de cada nueva línea.
Esta característica hace que la ventana del programa se utilice directamente para muchas ediciones de texto,
tareas tales como redactar correos email antes de enviarlos.
</span></p><p style="margin-top: 0; margin-bottom: 0.17in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt"><b>Plan 9 y 8½
</b></span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">Plan 9 es un sistema distribuido que proporciona soporte para aplicaciones tipo UNIX
en un entorno construido a partir de distintos 
</span><span style="font-size: 10pt"><i>CPU</i></span><span style="font-size: 10pt">servers
[servidores centrales],
</span><span style="font-size: 10pt"><i>file</i></span><span style="font-size: 10pt">servers
[servidores de archivos],y terminales
conectados por varias redes [Pike90].
Los terminales son comparables a modestas estaciones de trabajo [
</span><span style="font-size: 10pt"><i>workstations]</i></span><span style="font-size: 10pt">
que, una vez conectadas a un
</span><span style="font-size: 10pt"><i>file</i></span><span style="font-size: 10pt">server
sobre una red de ancho de banda medio como Ethernet, son máquinas autosuficientes
ejecutando un sistema operativo completo.
A diferencia de las 
</span><span style="font-size: 10pt"><i>workstations</i></span><span style="font-size: 10pt">
cuyo papel, sin embargo, es el de
proporcionar sólo una interfaz de usuario multiplexada comparable al resto del sistema:
ejecutan el sistema de ventana y soportan tareas interactivas
simples tales como la edición de texto.
Para nosotros se suele mentir en alguna parte respecto de las
</span><span style="font-size: 10pt"><i>workstations</i></span><span style="font-size: 10pt">
y los terminales X en cuanto a diseño,
coste, manejo, y función.
(Los terminales pueden ser usados
para computación en términos generales, pero en la práctica los usuarios de Plan 9 hacen sus
tareas en los
</span><span style="font-size: 10pt"><i>CPU</i></span><span style="font-size: 10pt">servers.)
El software de terminal de Plan 9, incluyendo 8½,
fue desarrollado en una máquina basada 
en el procesador 68020 de Motorola llamada Gnot
y se ha portado a
 NeXTstation,
 MIPS Magnum 3000,
SGI Indigos,
y Sun SPARCstations&mdash;todas las pequeñas
</span><span style="font-size: 10pt"><i>workstations</i></span><span style="font-size: 10pt">
que usamos como terminales&mdash;como
también a PCs.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">Las computaciones más grandes tales como la compilación, procesado de textos,
o cálculo científico se realizan en los
</span><span style="font-size: 10pt"><i>CPU</i></span><span style="font-size: 10pt">servers,
que están conectados
a los
</span><span style="font-size: 10pt"><i>file</i></span><span style="font-size: 10pt">servers
mediante redes de amplio ancho de banda.
Para trabajo interactivo,
estas operaciones pueden acceder al terminal que las envió instantáneamente.
El terminal y el
</span><span style="font-size: 10pt"><i>CPU</i></span><span style="font-size: 10pt">server
estando usados por un usuario en particular son conectados al
mismo
</span><span style="font-size: 10pt"><i>file</i></span><span style="font-size: 10pt">server,
aunque sobre redes diferentes; Plan 9 proporciona una vista del
</span><span style="font-size: 10pt"><i>file</i></span><span style="font-size: 10pt">server
que es independiente de la localización en la red.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">Los componentes de Plan 9 son conectados por un protoclo com&uacute;n basado en los archivos compartidos.
Todos los recursos en la red son implementados como servidores de archivo; los programas que deseen
acceder a ellos se conectan sobre la red y se comunican usando un archivo ordinario de
operaciones.
Un aspecto inusual de Plan 9 es que el
</span><span style="font-size: 10pt"><i>espacio de nombres
</i></span><span style="font-size: 10pt">de un proceso, el grupo de archivos a los que puede accederse por su nombre,
(por ejemplo por una llamada al sistema
</span><span style="font-size: 10pt"><tt>open</tt></span><span style="font-size: 10pt">
) no es global para todos los procesos en una máquina; distintos procesos
pueden tener distintos espacios de nombres.  El sistema proporciona métodos mediante los cuales los procesos
pueden cambiar su espacio de nombres, tal como se habilita para
</span><span style="font-size: 10pt"><i>mount</i></span><span style="font-size: 10pt">
un servicio sobre un directorio existente, que hace visibles los archivos de ese servicio
en el directorio.
(Es una operación diferente de la de su homónimo en
UNIX.)
M&uacute;ltiples servicios se pueden montar sobre el mismo directorio,
dejando los archivos de m&uacute;ltiples servicios para ser accedidos en el mismo directorio.
Las opciones para la llamada al sistema
</span><span style="font-size: 10pt"><tt>mount</tt></span><span style="font-size: 10pt">
controlan el orden de b&uacute;squeda de archivos semejante a un
</span><span style="font-size: 10pt"><i>directorio de unión.
</i></span><span style="font-size: 10pt"></span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">El ejemplo más obvio de una red de recursos es un
</span><span style="font-size: 10pt"><i>file</i></span><span style="font-size: 10pt">server,
Donde residen permanentemente los archivos. Hay un n&uacute;mero de servicios inusuales, sin embargo, cuyo diseño en
un entorno diferente no estaría claramente basado en archivos. Se han descrito muchos
en otras partes [Pike92]; algunos ejemplos son la representación
de procesos por depuración,
como los archivos de procesos de Killian para la 8&ordf; Edición [Kill84],
y la implementación de los pares nombre/valor de los
</span><span style="font-size: 10pt"><tt>exec</tt></span><span style="font-size: 10pt">
del entorno UNIX como archivos.
Los procesos de usuario pueden también implementar un archivo de servicio y habilitarlo para los clientes
de la red, como las &lsquo;mounted streams&rsquo; en la 9&ordf; Edición
[Pres90].
un ejemplo típico es un programa que interpreta un archivo de sistema externamente definido
como el de un CD-ROM o un sistema
UNIX
estándard y habilita el contenido a programas de Plan 9.
Este diseño se utiliza para todas las aplicaciones distribuidas en Plan 9, incluyendo 8½.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">8½ sirve un grupo de archivos en el directorio convencional
</span><span style="font-size: 10pt"><tt>/dev</tt></span><span style="font-size: 10pt">
con nombres como
</span><span style="font-size: 10pt"><tt>cons</tt></span><span style="font-size: 10pt">,
</span><span style="font-size: 10pt"><tt>mouse</tt></span><span style="font-size: 10pt">,
y
</span><span style="font-size: 10pt"><tt>screen</tt></span><span style="font-size: 10pt">.
Los clientes de 8½ se comunican con el sistema de ventana leyendo y escribiendo
esos archivos.
Por ejemplo, un programa cliente, como puede ser la shell,
puede imprimir texto leyendo su salida estándard, que es automáticamente
conectada a
</span><span style="font-size: 10pt"><tt>/dev/cons</tt></span><span style="font-size: 10pt">,
o podría abrir y escribir ese archivo explícitamente.
Sin embargo, a diferencia de los archivos servidos por un
</span><span style="font-size: 10pt"><i>file</i></span><span style="font-size: 10pt">server
tradicional,  la instancia de
</span><span style="font-size: 10pt"><tt>/dev/cons</tt></span><span style="font-size: 10pt">
proporcionada en cada ventana por 8½ es un archivo distinto;
el  pre-proceso del espacio de nombres de Plan 9 deja a 8½ proporcionar un &uacute;nico
</span><span style="font-size: 10pt"><tt>/dev/cons</tt></span><span style="font-size: 10pt">
para cada cliente.
Este mecanismo se ilustra mejor en la creación de un nuevo cliente de 8½.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">Cuando arranca 8½, crea un conducto full-duplex como medio de comunicación
para los mensajes que implementa el fichero de servicio que proporcionará.
Una finalidad será compartida por todos los clientes; la otra es sostenida por
8½ para aceptar peticiones de I/O.
Cuando un usuario abre una nueva ventana usando el ratón,
8½ posiciona en memoria las estructuras de datos de la ventana y bifurca un proceso hijo.
El espacio de nombres del hijo,
inicialmente compartido con el padre,
se duplica entonces
así que los cambios que haga el hijo en su espacio de nombres no afectará a su progenitor.
El hijo entonces procede a finalizar su conducto de comunicación,
</span><span style="font-size: 10pt"><tt>cfd</tt></span><span style="font-size: 10pt">,
para el directorio
</span><span style="font-size: 10pt"><tt>/dev</tt></span><span style="font-size: 10pt">
mediante una ejecución de la llamada de sistema:
</span><span style="font-size: 10pt"><tt>mount</tt></span><span style="font-size: 10pt">
</span></p><p style="margin-top: 0; margin-bottom: 0.17in"></p>

<p style="margin-top: 0; margin-bottom: 0.08in"></p>
<p style="line-height: 1.1em; margin-left: 1.40in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 9pt"><tt>mount(cfd, "/dev", MBEFORE, buf)</tt></span></p>
<p style="margin-top: 0; margin-bottom: 0.17in"></p>

<p style="margin-top: 0; margin-bottom: 0.08in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">Esta llamada accede al servicio asociado al descriptor de archivo
</span><span style="font-size: 10pt"><tt>cfd</tt></span><span style="font-size: 10pt">
&mdash; el cliente al final del conducto &mdash; al comienzo de
</span><span style="font-size: 10pt"><tt>/dev</tt></span><span style="font-size: 10pt">
de modo que los archivos en el nuevo servicio tengan prioridad sobre los archivos existentes
en el directorio.
Esto crea los nuevos archivos
</span><span style="font-size: 10pt"><tt>cons</tt></span><span style="font-size: 10pt">,
</span><span style="font-size: 10pt"><tt>mouse</tt></span><span style="font-size: 10pt">,
y demás,
disponibles en
</span><span style="font-size: 10pt"><tt>/dev</tt></span><span style="font-size: 10pt">
en una ruta que oculta cualquier archivo con el mismo nombre que haya ya en ese lugar.
El argumento
</span><span style="font-size: 10pt"><tt>buf</tt></span><span style="font-size: 10pt">
es una cadena de caracteres (null en este caso),
descrita después.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">El proceso cliente cierra entonces los descriptores de archivo 0, 1, y 2 y abre
</span><span style="font-size: 10pt"><tt>/dev/cons</tt></span><span style="font-size: 10pt">
repetidamente para conectar los estándares de
entrada, salida, y archivos de error de la ventana
</span><span style="font-size: 10pt"><tt>/dev/cons</tt></span><span style="font-size: 10pt">.
Hace entonces un
</span><span style="font-size: 10pt"><tt>exec</tt></span><span style="font-size: 10pt">
llamada al sistema para empezar a ejecutar la shell en la ventana.
Esta secuencia entera, completa con el manejo de rror, es de 33 líneas de C.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">La vista de estos eventos desde el final del conducto de 8½ es una secuencia
mensajes de protocolo de archivo del nuevo cliente generado por la
intervención del sistema
operativo en respuesta a las llamadas al sistema
</span><span style="font-size: 10pt"><tt>mount</tt></span><span style="font-size: 10pt">
y
</span><span style="font-size: 10pt"><tt>open</tt></span><span style="font-size: 10pt">
ejecutadas por el cliente.
Este mensaje generado por
</span><span style="font-size: 10pt"><tt>mount</tt></span><span style="font-size: 10pt">
informa a 8½ que un nuevo cliente ha accedido al fichero de servicio que proporciona;
La respuesta de 8½ es un &uacute;nico identificador mantenido por el sistema operativo y
pasado en todos los mensajes generados por I/O en los archivos derivados de ese
</span><span style="font-size: 10pt"><tt>mount</tt></span><span style="font-size: 10pt">.
Este identificador es usado por 8½ para distinguir los diferentes clientes aunque
cada uno vea un &uacute;nico
</span><span style="font-size: 10pt"><tt>/dev/cons</tt></span><span style="font-size: 10pt">;
la mayoría de los servidoresn o necesitan hacer esta distinción.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">Un proceso no notificado a 8½ podría crear ventanas mediante una variante de este mecanismo.
Cuando 8½ arranca, usa un servicio de Plan 9 para &lsquo;postear&rsquo; el final del conducto de
comunicación del cliente en un lugar p&uacute;blico.
Un proceso pordía abrir ese conducto y
</span><span style="font-size: 10pt"><tt>mount</tt></span><span style="font-size: 10pt">
acceder al sistema de ventana,
mejor que la forma en que un cliente X podría conectar a un socket de
UNIX
al limitar el servidor al sistema de archivos.
el argumento final para
</span><span style="font-size: 10pt"><tt>mount</tt></span><span style="font-size: 10pt">
es pasado sin interpretar por el sistema
operativo.
proporciona una forma para el cliente y el servidor de
intercambiar información a la vez que
</span><span style="font-size: 10pt"><tt>mount</tt></span><span style="font-size: 10pt">.
8½ lo interpreta como las dimensiones de la ventana a
crear pro el nuevo cliente.  (Como se ha visto antes, la ventana se ha
durante el tiempo en que ocurre mount, y
</span><span style="font-size: 10pt"><tt>buf</tt></span><span style="font-size: 10pt">
no lleva información.)
Cuando
</span><span style="font-size: 10pt"><tt>mount</tt></span><span style="font-size: 10pt">
retorna, el proceso puede abrir los archivos de la nueva ventana y empezar I/O para
usarla.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">Como la interfaz de 8½ está basada en archivos,
las utilidades estándard del sistema pueden usarse para controlar sus servicios.
Por ejemplo,
su método de crear ventanas externamente es empaquetado en un
shell script de 16 líneas, llamado
</span><span style="font-size: 10pt"><tt>window</tt></span><span style="font-size: 10pt">,
el contenido del cual es sólo una operación
</span><span style="font-size: 10pt"><tt>mount</tt></span><span style="font-size: 10pt">
que prefigura el directorio de 8½ para
</span><span style="font-size: 10pt"><tt>/dev</tt></span><span style="font-size: 10pt">
y ejecuta un comando pasado en la línea como argumento:
</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p>
<p style="line-height: 1.1em; margin-left: 1.40in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 9pt"><tt>mount -b $&rsquo;8½serv&rsquo; /dev</tt></span></p>
<p style="line-height: 1.1em; margin-left: 1.40in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 9pt"><tt>$* &lt; /dev/cons &gt; /dev/cons &gt;[2] /dev/cons &amp;</tt></span></p>
<p style="margin-top: 0; margin-bottom: 0.17in"></p>

<p style="margin-top: 0; margin-bottom: 0.08in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">El programa
</span><span style="font-size: 10pt"><tt>window</tt></span><span style="font-size: 10pt">
empleado típicamente por los usuarios para sus
entornos de trabajo iniciales cuando arrancan el sistema, aunque
más posibilidades generales.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">Otras características básicas del sistema se derivan naturalmente del
modelo basado en archivos.
Cuando el usuario borra una ventana, 8½ envía el equivalente de una señal de
UNIX
al grupo de procesos &mdash; los clientes &mdash; en la ventana,
quita la ventana de la pantalla, y de niega las conexiones entrantes
a los archivos que la manejen.  Si un cliente ignora la señal y
contin&uacute;a escribiendo en la ventana, obtendrá errores de I/O.
Si, por otra parte, todos los procesos en una ventana terminan espontáneamente,
automáticamente cerrarán todas las conexiones a la ventana.
8½ cuenta con referencias a los archivos de la ventana; cuando no hay niguno pendiente,
cierra la ventana y la borra de la pantalla.
Como ejemplo diferente, cuando el usuario presiona la tecla DEL para generar una
interrupción,
8½ escribe un mensaje a un archivo especial, proporcionado por la interfaz
de control de procesos de Plan 9, que interrumpe todos los procesos
en la ventana.
En todos estos ejemplos, los trabajos de implementación se hacen entrelazadamente
a través de una red.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">Hay dos aspectos valorables a efectos de implementar un
sistema de ventana por multiplexación de
</span><span style="font-size: 10pt"><tt>/dev/cons</tt></span><span style="font-size: 10pt">
y otros ficheros parecidos.
Primero, el problema de otorgar una completa significación
para interpretar el fichero
</span><span style="font-size: 10pt"><tt>/dev/cons</tt></span><span style="font-size: 10pt">
(</span><span style="font-size: 10pt"><tt>/dev/tty</tt></span><span style="font-size: 10pt">)
en cada ventana es solventado automáticamente.
Proporcionar
</span><span style="font-size: 10pt"><tt>/dev/cons</tt></span><span style="font-size: 10pt">
es la tarea fundamental del sistema de ventana, más que una torpe carga;
otros sistemas deben incluso hacer arreglos especiales y si no irrelevantes para que
</span><span style="font-size: 10pt"><tt>/dev/tty</tt></span><span style="font-size: 10pt">
se comporte como se espera en una ventana.
Segundo, cualquier programa que pueda acceder al servidor, incluyendo un
proceso en una máquina remota, puede acceder a los ficheros utilizando las llamadas
al sistema estándares de read y wirte para comunicar con el sistema de ventana,
y las llamadas estándares open y close para conectar con él.
De nuevo, no se necesitan arreglso especiales para hacer que un proceso remoto
utilice todas las facilidades gráficas de 8½.
</span></p><p style="margin-top: 0; margin-bottom: 0.17in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt"><b>Entrada en modo Gráfico
</b></span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">Por supuesto 8½ ofrece más que un simple ASCII I/O para sus clientes.
El estado del ratón podría descubrirse mediante la lectura del archivo
</span><span style="font-size: 10pt"><tt>/dev/mouse</tt></span><span style="font-size: 10pt">,
que retorna un mensaje de 10 bytes codificando el estado
de los botones y la posición del cursor.
Si el ratón no se ha movido desde la &uacute;ltima lectura de
</span><span style="font-size: 10pt"><tt>/dev/mouse</tt></span><span style="font-size: 10pt">,
o si la ventana asociada con la instancia de
</span><span style="font-size: 10pt"><tt>/dev/mouse</tt></span><span style="font-size: 10pt">
no es la de &lsquo;input focus&rsquo;, entonces lee los bloques.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">El formato del mensaje es:
</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p>
<p style="line-height: 1.2em; margin-left: 1.50in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt"></span><span style="font-size: 10pt"><tt>&rsquo;m&rsquo;</tt></span><span style="font-size: 10pt"></span></p>
<p style="line-height: 1.2em; margin-left: 1.50in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">1 byte del estado del botón</span></p>
<p style="line-height: 1.2em; margin-left: 1.50in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">4 bytes of x, primer byte bajo</span></p>
<p style="line-height: 1.2em; margin-left: 1.50in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">4 bytes of y, primer byte bajo</span></p>
<p style="margin-top: 0; margin-bottom: 0.02in"></p>

<p style="margin-top: 0; margin-bottom: 0.08in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">Como en todas las estructuras de datos compartidas en Plan 9,
el orden de cada byte en el mensaje es definido 
tal que todos los clientes pueden ejecutar el mismo código para desempaquetar el mensaje
dentro de una estructura de datos local.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">Para la entrada de teclado, los clientes pueden leer
</span><span style="font-size: 10pt"><tt>/dev/cons</tt></span><span style="font-size: 10pt">
o, si necesitan la entrada de caracteres en tiempo real,
</span><span style="font-size: 10pt"><tt>/dev/rcons</tt></span><span style="font-size: 10pt">
(&lsquo;raw console&rsquo;).
No hay mecanismo eventual explícito para auxiliar a los clientes que necesiten leer
de m&uacute;ltiples códigos.
En su lugar, se puede usar una pequeña (365 líneas) librería
de soporte externo.
&Eacute;sta accede a un proceso
tpara la entrada de varios bloques de código &mdash; ratón, teclado and quizá
un tercer descriptor de archivo proporcionado por el usuario &mdash;
y embute su entrada dentro de un conducto simple desde el cual pueden leerse
los diferentes tipos de
eventos en el estilo tradicional.
Este paquete es un compromiso.  Como discutí en una conferencia anterior
[Pike89] prefiero
liberar a las aplicaciones desde eventos basados en programación.  desafortunadamente, creo, veo
que no hay camino fácil para alcanzar ésto a través de programas en C de una vez por todas, y estoy poco dispuesto
a requerir de todos los programadores que se adueñen de la conveniente programación.
Debería notarse, pienso, que incluso este compromiso concluye en una interfaz
pequeña y fácilmente inteligible.  Un ejemplo de un programa que lo usa
se presenta cerca del final de este documento.
</span></p><p style="margin-top: 0; margin-bottom: 0.17in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt"><b>Salida en modo Gráfico
</b></span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">El archivo
</span><span style="font-size: 10pt"><tt>/dev/screen</tt></span><span style="font-size: 10pt">
puede leer desde cualquier cliente para recuperar los contenidos de la pantalla entera,
así como imprimirlos (ver Fig. 1).
Similarmente,
</span><span style="font-size: 10pt"><tt>/dev/window</tt></span><span style="font-size: 10pt">
recoge los contenidos de la ventana activa.
Estos ficheros son de sólo lectura.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">Para manejar las operaciones gráficas en sus ventanas, los programas clientes acceden a
</span><span style="font-size: 10pt"><tt>/dev/bitblt</tt></span><span style="font-size: 10pt">.
&Eacute;ste implementa un protocolo que codifica las operaciones básicas de mapas de bits.
La mayoría de lso mensajes en el protocolo (hay 23 mensaje en total, casi
la mitad para manejar las fuentes multi-nivel necesarias para un manejo eficiente
de los caracteres Unicode)
son transmisiones (vía escritura)
del cliente al sistema de ventana para manipular una operación
gráfica así como un
</span><span style="font-size: 10pt"><tt>bitblt</tt></span><span style="font-size: 10pt">
[PLR85] u operación de dibujo de caracteres; algunos incluyen información retornada
(recuperada vía lectura) para el cliente.
Como con
</span><span style="font-size: 10pt"><tt>/dev/mouse</tt></span><span style="font-size: 10pt">,
el protocolo
</span><span style="font-size: 10pt"><tt>/dev/bitblt</tt></span><span style="font-size: 10pt">
es un orden definidos de bytes.
quí, como ejemplo, está el mapa del mensaje
</span><span style="font-size: 10pt"><tt>bitblt:</tt></span><span style="font-size: 10pt">
</span></p><p style="margin-top: 0; margin-bottom: 0.17in"></p>

<p style="margin-top: 0; margin-bottom: 0.08in"></p>
<p style="line-height: 1.2em; margin-left: 1.50in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt"></span><span style="font-size: 10pt"><tt>&rsquo;b&rsquo;</tt></span><span style="font-size: 10pt"></span></p>
<p style="line-height: 1.2em; margin-left: 1.50in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">2 bytes de id de destino</span></p>
<p style="line-height: 1.2em; margin-left: 1.50in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">2x4 bytes de punto de destino</span></p>
<p style="line-height: 1.2em; margin-left: 1.50in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">2 bytes de id de código</span></p>
<p style="line-height: 1.2em; margin-left: 1.50in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">4x4 bytes del código de rectángulo</span></p>
<p style="line-height: 1.2em; margin-left: 1.50in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">2 bytes del código de función boolean</span></p>
<p style="margin-top: 0; margin-bottom: 0.02in"></p>

<p style="margin-top: 0; margin-bottom: 0.08in"></p>
<center><img src="8½.fig1s.png"></center>
</center>
<p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.35in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">Figure 1.
Una pantalla representativa de 8½, corriendo sobre una NeXTstation bajo Plan 9
(sin software NeXT alguno).  Arriba a la derecha, un programa notifica
la llegada de un correo.  Arriba del todo y a la izquierda hay un navegador para bases de datos
de astronomía y una imagen de una galaxia producida por el navegador.
Más abajo a la izquierda hay un editor de pantalla,
</span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt">
[Pike87],
editando texto japonés codificado en UTF,
y más abajo a la derecha un 8½ ejecutándose de forma recursiva y, dentro de la instantánea,
una vista previa para la salida de
</span><span style="font-size: 10pt"><tt>troff</tt></span><span style="font-size: 10pt">
or debajo de las caras en la ventanita se ejecuta el comando que
imprime la pantalla mediante
</span><span style="font-size: 10pt"><tt>/dev/screen</tt></span><span style="font-size: 10pt">
a la utilidad de impresión de mapas de bits.
</span></p><p style="margin-top: 0; margin-bottom: 0.17in"></p>
<p style="margin-top: 0; margin-bottom: 0.02in"></p>

<p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">Este mensaje es construido trivialmente desde la subrutina
</span><span style="font-size: 10pt"><tt>bitblt</tt></span><span style="font-size: 10pt">
en la librería, definida como
</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p>
<p style="line-height: 1.1em; margin-left: 1.40in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 9pt"><tt>void bitblt(Bitmap *dst, Point dp,</tt></span></p>
<p style="line-height: 1.1em; margin-left: 1.40in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 9pt"><tt>            Bitmap *src, Rectangle sr, Fcode c).</tt></span></p>
<p style="margin-top: 0; margin-bottom: 0.17in"></p>

<p style="margin-top: 0; margin-bottom: 0.08in"></p>
<p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">los campos &lsquo;id&rsquo;
en el mensaje indican otra propiedad de 8½:
los clientes no almacenan los datos actuales localmente para ninguno de sus mapas de bits.
En su lugar, el protocolo porporciona un mensaje para colocar el mapa de bits, para
almacenarlo en el servidor, y devuelve al cliente un entero identificador,
mejor que un descriptor de archivos de
UNIX
, para usarlo en las operaciones de ese mapa de bits.
El mapa de bits 0 es por convención la ventana del cliente,
análogo a la entrada estándard del archivo de I/O.
De hecho, las operaciones gráficas de mapas de bits no son ejecutadas en el cliente en su totalidad;
todas ellas son manejadas a medias en el servidor.
De nuevo, usando el archivo de operaciones remotas de Plan 9,
esto permite que las máquinas remotas no necesiten tener capacidad gráfica, como
el CPU server,
para correr aplicaciones gráficas.
Características análogas al sistema de ventana original de Andrew [Gos86]
y de X [Sche86] requieren mecanismos más complejos.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">8½ ni siquiera opera por sí mismo directamente en los mapas de bits.
En su lugar, llama a otro servidor para sus operaciones gráficas,
usando un protocolo idéntico.
El sistema operativo para los terminales de Plan 9 contiene un servidor
interno que implementa ese protocolo, exactamente como lo hace 8½, pero para un sólo
cliente.  Ese servidor almacena los bytes actuales para los mapas de bits
e implementa las operaciones gráficas fundamentales para mapas de bits.
Para nosotros, el entorno en el que corre 8½
tiene exactamente la estructura que porporciona a sus clientes;
8½ reproduce el entorno para sus clientes,
multiplexando la interfaz para mantener separados sus clientes.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">Esta idea de la multiplexación por simulación se aplica a más cosas aparte de
los sistemas de ventana, por supuesto, y tiene algunos aspectos en sus efectos.
En el momento en que 8½ simula su propio entorno para sus clientes, puede correr
en una de sus propias ventanas (see Figure 1).
Una aplicación &uacute;til y com&uacute;n de esta
técnica es conectar una ventana a una máquina remota, como un CPU
server, y ejecutar el sistema de ventana allí de manera que cada subventana está automáticamente
en la máquina remota.
Es también una manera manejablemente fácil para depurar una nueva versión del sistema de ventana
o para crear un entorno, por ejemplo, con una fuente diferente por defecto.
</span></p><p style="margin-top: 0; margin-bottom: 0.17in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt"><b>Implementación
</b></span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">Para proporcionar gráficos a sus clientes, la mayoría de las veces 8½ tan sólo multiplexa y pasa
a través de su propio servidor las peticiones de los clientes, ocasionalmente rearreglando
los mensajes para mantener la ficción de que el cliente tiene una &uacute;nica pantalla
(ventanas).
Para manejar la superposición de ventanas utiliza el modelo de capas,
que es controlado por una librería separada [Pike83a].
Para nosotros es poco trabajo a hacer y es un programa bastante simple;
está dominado por una c&uacute;pula de estamentos encaminados a interpretar
el mapa de bits y los protocolos del sistema de archivos.
El programa de construcción de la ventana, sus men&uacute;s asociados y el soporte para el
tratamiento de texto son responsables de la mayoría del código.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">El servidor del sistema operativo es también compacto:
la versión para el procesador 68020 de Motorola, excluyendo la implementación
de media docena de operaciones gráficas de mapas de bits, es de 2295 líneas de C
(de nuevo, casi la mitad a repartir con las fuentes);
las operaciones gráficas son otras 2214 líneas.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">8½ está estructurado como un set de corrutinas de comunicación,
mejor expuestas en el documento de 1989 [Pike89].
Una corrutina maneja el ratón, otra el teclado y otra
es instada a manejar el estado de cada ventana y su cliente asociado.
Cuando no hay ninguna corrutina que quiera ejecutarse, 8½ lee el siguiente fichero de petición de I/O de
sus clientes, que llega seguidamente por el conducto de comunicación full-duplex.
Para nosotros 8½ es enteramente síncrono.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">El código del programa es pequeño y compila en unos 10 segundos
en nuestro entorno Plan 9.  Hay diez archivos de código fuente y
uno
</span><span style="font-size: 10pt"><tt>makefile</tt></span><span style="font-size: 10pt">
totalizando 5100 líneas.
Esto incluye el código fuente para el proceso de gestión de ventana,
el programa del terminal de cortar-y-pegar,
la ventana/servidor de archivos mismo,
y una pequeña librería de corrutinas
(</span><span style="font-size: 10pt"><tt>proc.c</tt></span><span style="font-size: 10pt">).
&Eacute;sta no incluye la librería de capas
(otras 1031 líneas)
o la librería para manejar el cortado y pegado de texto
desplegado en una ventana (960 líneas),
o la librería de soporte gráfico general que gestiona todos los
los aspectos gráficos no dibujables &mdash; aritmética en puntos y rectángulos,
gestión de memoria, manejo de errores, clipping, &mdash; más fuentes,
eventos, y operaciones de dibujo no primitvas como círculos y elipses
(un total de 3051 líneas).
No todas las piezas de estas librerías son usadas por 8½ mismo;
una larga parte de la librería de gráficos en particular es usada sólo por los clientes.
Para nosotros es algo injusto para 8½ sumar estos n&uacute;meros sólamente, incluyendo
las 4509 líneas de soporte en el kernel y la llegada del tamaño total
de implementación a 14651 líneas de código fuente para implementar
todo 8½ desde los niveles más bajos a los más altos.
Pero ese n&uacute;mero da una medida justificada de la complejidad de todo el sistema.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">La implementación es también eficiente.
El perfeccionamiento de 8½ es competitivo al de X windows&rsquo;.
Comparado a usar
</span><span style="font-size: 10pt"><tt>gbench</tt></span><span style="font-size: 10pt">
de Dunwoody y Linton en pruebas en un 68020,
distribuido con la &lsquo;&lsquo;X Test Suite&rsquo;&rsquo;,
circulos y arcos se dibujan casi la mitad de rápido en 8½ que en
X11 release 4 compilado con
</span><span style="font-size: 10pt"><tt>gcc</tt></span><span style="font-size: 10pt">
para hardware equivalente,
probablemente porque son normalmente implementados en una librería de usuario
mediante llamadas a la primitiva
</span><span style="font-size: 10pt"><tt>point</tt></span><span style="font-size: 10pt">
La velocidad dibujando líneas es casi igual entre los dos sistemas.
El texto Unicode se dibuja casi a la misma velocidad en 8½ que el texto ASCII en
X, y
el test de
</span><span style="font-size: 10pt"><tt>bitblt</tt></span><span style="font-size: 10pt">
corre cuatro veces más rápido para 8½.
Estos n&uacute;meros varían bastante para procurar evitar conclusiones sobre el
barrido del trazado a dibujar, pero sugieren
que la arquitectura de 8½ no penaliza su perfeccionamiento.
Finalmente, 8½ se inicia en apenas un segundo y crea una nueva ventana
aparentemente de manera instantánea.
</span></p><p style="margin-top: 0; margin-bottom: 0.17in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt"><b>Un ejemplo
</b></span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">He aquí un programa completo que corre en 8½.
Imprime la cadena
</span><span style="font-size: 10pt"><tt>"hello</tt></span><span style="font-size: 10pt">
</span><span style="font-size: 10pt"><tt>world"</tt></span><span style="font-size: 10pt">
donde quiera que se presione el botón izquierdo del mouse, y sale cuando se
presiona el botón derecho.
También imprime la cadena en el centro de su ventana, y mantiene
esa cadena cuando se reconfigura el tamaño de la ventana.
</span></p><p style="margin-top: 0; margin-bottom: 0.08in"></p>
<p style="line-height: 1.1em; margin-left: 1.40in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 9pt"><tt>#include &lt;u.h&gt;</tt></span></p>
<p style="line-height: 1.1em; margin-left: 1.40in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 9pt"><tt>#include &lt;libc.h&gt;</tt></span></p>
<p style="line-height: 1.1em; margin-left: 1.40in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 9pt"><tt>#include &lt;libg.h&gt;</tt></span></p>
<p style="margin-top: 0; margin-bottom: 0.15in"></p>

<p style="line-height: 1.1em; margin-left: 1.40in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 9pt"><tt>void</tt></span></p>
<p style="line-height: 1.1em; margin-left: 1.40in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 9pt"><tt>ereshaped(Rectangle r)</tt></span></p>
<p style="line-height: 1.1em; margin-left: 1.40in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 9pt"><tt>{</tt></span></p>
<p style="line-height: 1.1em; margin-left: 1.40in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 9pt"><tt>    Point p;</tt></span></p>
<p style="margin-top: 0; margin-bottom: 0.15in"></p>

<p style="line-height: 1.1em; margin-left: 1.40in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 9pt"><tt>    screen.r = r;</tt></span></p>
<p style="line-height: 1.1em; margin-left: 1.40in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 9pt"><tt>    bitblt(&amp;screen, screen.r.min, &amp;screen, r, Zero); /* clear */</tt></span></p>
<p style="line-height: 1.1em; margin-left: 1.40in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 9pt"><tt>    p.x = screen.r.min.x + Dx(screen.r)/2;</tt></span></p>
<p style="line-height: 1.1em; margin-left: 1.40in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 9pt"><tt>    p.y = screen.r.min.y + Dy(screen.r)/2;</tt></span></p>
<p style="line-height: 1.1em; margin-left: 1.40in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 9pt"><tt>    p = sub(p, div(strsize(font, "hello world"), 2));</tt></span></p>
<p style="line-height: 1.1em; margin-left: 1.40in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 9pt"><tt>    string(&amp;screen, p, font, "hello world", S);</tt></span></p>
<p style="line-height: 1.1em; margin-left: 1.40in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 9pt"><tt>}</tt></span></p>
<p style="margin-top: 0; margin-bottom: 0.15in"></p>

<p style="line-height: 1.1em; margin-left: 1.40in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 9pt"><tt>main(void)</tt></span></p>
<p style="line-height: 1.1em; margin-left: 1.40in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 9pt"><tt>{</tt></span></p>
<p style="line-height: 1.1em; margin-left: 1.40in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 9pt"><tt>    Mouse m;</tt></span></p>
<p style="margin-top: 0; margin-bottom: 0.15in"></p>

<p style="line-height: 1.1em; margin-left: 1.40in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 9pt"><tt>    binit(0, 0, 0); /* inicializar la librería de gráficos */</tt></span></p>
<p style="line-height: 1.1em; margin-left: 1.40in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 9pt"><tt>    einit(Emouse);  /* inicializar la librería de eventos */</tt></span></p>
<p style="line-height: 1.1em; margin-left: 1.40in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 9pt"><tt>    ereshaped(screen.r);</tt></span></p>
<p style="line-height: 1.1em; margin-left: 1.40in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 9pt"><tt>    for(;;){</tt></span></p>
<p style="line-height: 1.1em; margin-left: 1.40in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 9pt"><tt>        m = emouse();</tt></span></p>
<p style="line-height: 1.1em; margin-left: 1.40in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 9pt"><tt>        if(m.buttons &amp; RIGHTB)</tt></span></p>
<p style="line-height: 1.1em; margin-left: 1.40in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 9pt"><tt>            break;</tt></span></p>
<p style="line-height: 1.1em; margin-left: 1.40in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 9pt"><tt>        if(m.buttons &amp; LEFTB){</tt></span></p>
<p style="line-height: 1.1em; margin-left: 1.40in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 9pt"><tt>            string(&amp;screen, m.xy, font, "hello world", S);</tt></span></p>
<p style="line-height: 1.1em; margin-left: 1.40in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 9pt"><tt>            /* wait for release of button */</tt></span></p>
<p style="line-height: 1.1em; margin-left: 1.40in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 9pt"><tt>            do; while(emouse().buttons &amp; LEFTB);</tt></span></p>
<p style="line-height: 1.1em; margin-left: 1.40in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 9pt"><tt>        }</tt></span></p>
<p style="line-height: 1.1em; margin-left: 1.40in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 9pt"><tt>    }</tt></span></p>
<p style="line-height: 1.1em; margin-left: 1.40in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 9pt"><tt>}</tt></span></p>
<p style="margin-top: 0; margin-bottom: 0.17in"></p>

<p style="margin-top: 0; margin-bottom: 0.08in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">El binario completo cargado es un poco más de 26K bytes en un 68020.
Este programa debería ser comparado a uno similar en la excelente ponencia
de Rosenthal [Rose88].
(El programa en cuestión hace más: también emplea el ratón.)
La parte más torpe es
</span><span style="font-size: 10pt"><tt>ereshaped</tt></span><span style="font-size: 10pt">,
una función de nombre conocido que se llama desde al librería de eventos
cuando quiera que la ventana sea
reformada o movida, se ha presentado de forma poco elegante pero adecuadamente
para el caso especial de un mensaje dle ratón.
(Los eventos expuestos denominados simples no son eventos
en su totalidad en 8½; la librería de capas cuida de ellos de manera transparente.)
La lección de este programa, en deferencia a Rosenthal, es que si
el sistema de ventana está limpiamente diseñado debería ser necesario un toolkit
para tareas simples.
</span></p><p style="margin-top: 0; margin-bottom: 0.17in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt"><b>Status
</b></span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">Desde 1992, 8½ está en uso diario regular por casi la totalidad de las 60 personas en nuestro
centro de investigación.  Algunas de estas personas lo usan para acceder a Plan 9 mismo; otras
lo usan como un front-end remoto para sistemas
UNIX
, mejor de lo que sería usar un terminal X.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">Algunas cosas sobre 8½ podrían cambiar.
Sería genial si sus capacidades fuesen accesibles más fácilmente
desde la shell.
Un compañero de este documento [Pike91] propone una manera de hacerlo,
pero eso no incluye ninguna funcionalidad gráfica.
Quizá una versión de texto del fichero
</span><span style="font-size: 10pt"><tt>/dev/bitblt</tt></span><span style="font-size: 10pt">
es una forma de proceder; que seguiría, por ejemplo, por programas
</span><span style="font-size: 10pt"><tt>awk</tt></span><span style="font-size: 10pt">
para dibujar gráficos directamente.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">Puede este tipo de sistema de ventana ser construido en otros sistemas operativos?
La mayor parte del diseño de 8½ depende de su estructura como un servidor de archivos.
En principio, esto podría hacerlo cualquier sistema que soportase procesos de usuario
que sirven archivos, como cualquier sistema que corra sobre NFS o AFS [Sun89, Kaza87].
Un requerimiento, en cualquier caso, es la necesidad de 8½
para responder a sus clientes&rsquo; peticiones fuera de orden:
si un cliente lee
</span><span style="font-size: 10pt"><tt>/dev/cons</tt></span><span style="font-size: 10pt">
en una ventana sin caracteres para leer,
otros clientes deberían poder manejar I/O en sus ventanas, o incluso
en la misma ventana.
Otra condición es que los archivos de 8½ son como dispositivos,
y no deben ser cacheados por el cliente.
NFS no puede hacer honor a estos requerimientos; AFS podría ser viable.
Por supuesto, otros mecanismos de comunicación interprocesales como los sockets
se podrían usar como una base para un sistema de ventana.  ALguien podría incluso argumentar que
el modelo de X se ajusta a este esquema general.  Podría probar fácilmente sus méritos
para escribir un sistema tipo 8½ para sistemas comerciales de
UNIX
con el fin de demostrar que sus méritos se pueden ganar en otros sistemas además de
Plan 9.
</span></p><p style="margin-top: 0; margin-bottom: 0.17in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt"><b>Conclusión
</b></span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">En conclusión, 8½ utiliza una arquitectura inusual en
concierto con la comunicación interprocesal orientada a archivos de Plan 9
para proporcionar gráficos interactivos basados en red para programas clientes.
Lo que demuestra que incluso la calidad de producción de sistemas de ventana no es
larga o complicada de manera inherente
y podría ser simple de usar y programar.
</span></p><p style="margin-top: 0; margin-bottom: 0.17in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt"><b>Reconocimientos
</b></span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.35in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">A los comentarios de gran ayuda en los primeros trazos de redacción de este dcumentos hechos por
Doug Blewett,
Stu Feldman,
Chris Fraser,
Brian Kernighan,
Dennis Ritchie,
y Phil Winterbottom.
El soporte para el color de 8½ fue añadido por Howard Trickey.
Muchas de estas ideas que conducen a 8½ se intentaron en antiguos, ya veces menos
satisfactorios, programas.  Me gustaría mostrar mi agradecimiento a aquellos usuarios que sufrieron
algunos de mis previos sistemas de ventanas 7½.
</span></p><p style="margin-top: 0; margin-bottom: 0.17in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt"><b>Referencias
</b></span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">[Duff90] Tom Duff, &lsquo;&lsquo;Rc - A Shell for Plan 9 and UNIX systems&rsquo;&rsquo;, Proc. of the Summer 1990 UKUUG Conf., Londres, Julio, 1990, pp. 21-33, reimpreso, en diferente formato, en este volumen.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">[Far89] Far too many people, XTERM(1), Massachusetts Institute of Technology, 1989.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">[Gos86] James Gosling y David Rosenthal,
&lsquo;&lsquo;A window manager for bitmapped displays and UNIX&rsquo;&rsquo;, en Methodology of Window Management, editado por F.R.A. Hopgood et al., Primavera, 1986.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">[Kaza87] Mike Kazar, &lsquo;&lsquo;Synchronization and Caching issues in the Andrew File System&rsquo;&rsquo;, Tech. Rept. CMU-ITC-058, Information Technology Center, Carnegie Mellon University, Junio, 1987.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">[Kill84] Tom Killian, &lsquo;&lsquo;Processes as Files&rsquo;&rsquo;, USENIX Summer Conf. Proc., Salt Lake City Junio, 1984.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">[Pike83] Rob Pike, &lsquo;&lsquo;The Blit: A Multiplexed Graphics Terminal&rsquo;&rsquo;, Bell Labs Tech. J., V63, #8, part 2, pp. 1607-1631.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">[Pike83a] Rob Pike, &lsquo;&lsquo;Graphics in Overlapping Bitmap Layers&rsquo;&rsquo;, Trans. on Graph., Vol 2, #2, 135-160, reimpreso en Proc. SIGGRAPH &rsquo;83, pp. 331-356.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">[Pike87] Rob Pike, &lsquo;&lsquo;The Text Editor </span><span style="font-size: 10pt"><tt>sam</tt></span><span style="font-size: 10pt">&rsquo;&rsquo;, Softw. - Prac. and Exp., Nov 1987, Vol 17 #11, pp. 813-845, reimpreso en este volumen.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">[Pike88] Rob Pike, &lsquo;&lsquo;Window Systems Should Be Transparent&rsquo;&rsquo;, Comp. Sys., Verano de 1988, Vol 1 #3, pp. 279-296.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">[Pike89] Rob Pike, &lsquo;&lsquo;A Concurrent Window System&rsquo;&rsquo;, Comp. Sys., Primavera de 1989, Vol 2 #2, pp. 133-153.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">[Pike91] Rob Pike, &lsquo;&lsquo;A Minimalist Global User Interface&rsquo;&rsquo;, USENIX Summer Conf. Proc., Nashville, Junio, 1991.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">[Pike92]  Rob Pike, Dave Presotto, Ken Thompson, Howard Trickey, y Phil Winterbottom,
Operating Systems Review
Vol 27, #2, Abril de 1993, pp. 72-76
(reimpreso desde Proceedings of the 5th ACM SIGOPS European Workshop, Mont Saint-Michel, 1992, Documento n&ordm; 34, y reimpreso en este volumen).
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">[Pike94] Rob Pike y Ken Thompson, &lsquo;&lsquo;Hello World or &Kappa;&alpha;&lambda;&eta;&mu;&#941;&rho;&alpha; &kappa;&#972;&sigma;&mu;&epsilon; or </span><span style="font-size: 10pt">&#12371;&#12435;&#12395;&#12385;&#12399; &#19990;&#30028;</span><span style="font-size: 10pt">&rsquo;&rsquo;, USENIX Winter Conf. Proc., San Diego, Enero, 1993, reimpreso en este volumen.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">[PLR85] Rob Pike, Bart Locanthi y John Reiser, &lsquo;&lsquo;Hardware/Software Tradeoffs for Bitmap Graphics on the Blit&rsquo;&rsquo;, Softw. - Prac. and Exp., Febrero de 1985, Vol 15 #2, pp. 131-152.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">[Pres90] David L. Presotto y Dennis M. Ritchie, &lsquo;&lsquo;Interprocess Communication in the Ninth Edition Unix System&rsquo;&rsquo;, Softw. - Prac. and Exp., Junio 1990, Vol 20 #S1, pp. S1/3-S1/17.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">[Rose88] David Rosenthal, &lsquo;&lsquo;A Simple X11 Client Program -or- How hard can it really be to write &lsquo;&lsquo;Hello, World&rsquo;&rsquo;?&rsquo;&rsquo;, USENIX Winter Conf. Proc., Dallas, Enro, 1988, pp. 229-242.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">[Sche86] Robert W. Scheifler y Jim Gettys,
&lsquo;&lsquo;The X Window System&rsquo;&rsquo;,
ACM Trans. on Graph., Vol 5 #2, pp. 79-109.
</span></p><p style="margin-top: 0; margin-bottom: 0.05in"></p>
<p style="line-height: 1.2em; margin-left: 1.00in; text-indent: 0.00in; margin-right: 1.00in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">[Sun89] Sun Microsystems, NFS: Network file system protocol specification,
RFC 1094, Network Information Center, SRI International, Marzo, 1989.
</span></p><p style="margin-top: 0; margin-bottom: 0.50in"></p>
<p style="margin-top: 0; margin-bottom: 0.17in"></p>
<p style="line-height: 1.2em; margin-left: 1.50in; text-indent: 0.35in; margin-right: 1.50in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt"></span><span style="font-size: 10pt"><b>Notes</b></span><span style="font-size: 10pt">
</span></p><p style="margin-top: 0; margin-bottom: 0.17in"></p>
<p style="margin-top: 0; margin-bottom: 0.17in"></p>

<p style="line-height: 1.2em; margin-left: 1.50in; text-indent: 0.00in; margin-right: 1.50in; margin-top: 0; margin-bottom: 0; text-align: justify;">
<span style="font-size: 10pt">Aparecido originalmente, en formato ligeramente diferente, en
</span><span style="font-size: 10pt"><i>Proc. of the Summer 1991 USENIX Conf.,
</i></span><span style="font-size: 10pt">pp. 257-265,
Nashville.
Nótese que
</span><span style="font-size: 10pt"><tt>8½</tt></span><span style="font-size: 10pt">
ha sido reemplazado por
</span><span style="font-size: 10pt"><tt>rio</tt></span><span style="font-size: 10pt">
(ver
</span><span style="font-size: 10pt"><i>rio</i></span><span style="font-size: 10pt">(1)).
</span></p><p style="margin-top: 0; margin-bottom: 0.17in"></p>
<p style="margin-top: 0; margin-bottom: 0.17in"></p>




</div>

<div id="footer">
<br class="doNotDisplay doNotPrint" />

<div class="left"><a href="http://werc.cat-v.org/">Powered by werc</a></div>

<div class="right">
<form action="http://www.google.com/cse" id="cse-search-box" style="display: inline">
  <div style="display: inline">
    <input type="hidden" name="cx" value="partner-pub-2060328396151526:ea9sar-xttn" />
    <input type="hidden" name="ie" value="UTF-8" />
    <input type="text" name="q" size="32" />
    <input type="submit" name="sa" value="Search" />
  </div>
</form>
<script type="text/javascript" src="http://www.google.com/coop/cse/brand?form=cse-search-box&lang=en"></script></div>


<script type="text/javascript">
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>
<script type="text/javascript">
try {
var pageTracker = _gat._getTracker("UA-1220719-1");
pageTracker._setDomainName("cat-v.org");
pageTracker._trackPageview();

var pageTracker2 = _gat._getTracker("UA-1220719-12");
pageTracker2._trackPageview();
} catch(err) {}</script>
</div>
</body></html>
